#include <QCoreApplication>
//生产者-消费者模型

#include<QSemaphore>
#include<QThread>
#include<QDebug>
#include<QVector>

const int DataSize=10;
const int BufferSize=5;//信号量大小

QSemaphore freeSpace(BufferSize);//信号量空余空间
QSemaphore usedSpace(0);//信号量使用空间
QVector<int> buffer(BufferSize);//共享缓冲区

class Producer:public QThread
{
public:
    void run() override
    {
        for(int i=0;i<DataSize;i++)
        { freeSpace.acquire();//获得空余空间
            buffer[i%BufferSize]=i;
            qDebug()<<"Produced:"<<i;

            usedSpace.release();//通知有数据可用

            //模拟生产时间
            msleep(100);
        }


    }
};
class Consumer:public QThread
{
   public:
    void run() override
    {
        for(int i=0;i<DataSize;i++)
        {
            usedSpace.acquire();
            int data=buffer[i%BufferSize];//拿数据
            qDebug()<<"Comsumed:"<<data;
            // 通知有空闲空间
                        freeSpace.release();
            freeSpace.release();
            msleep(200);

        }
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Producer producer;
    Consumer consumer;

    producer.start();
    consumer.start();
    producer.wait();
       consumer.wait();

    return a.exec();
}
